#ifndef REDISMANAGER_H
#define REDISMANAGER_H

#include <atomic>
#include <iostream>
#include <string>
#include <thread>
#include <functional>
#include <vector>
#include <mutex>
#include <condition_variable>
#include "public.h"

using namespace std;

//防止重定义
namespace sw
{
    namespace redis
    {
        class Redis;
    }
}

struct STU_REDIS_CONFIG
{
    //redis服务
    std::string redis_ip = "";
    int redis_port = 6379;
    //redis服务密码
    std::string redis_pwd = "";
    //默认选择的redis库
    int default_db =0;
};

struct STU_REDIS_CHANNEL
{
     string cmdAddFile; //新增媒体文件
     string cmdDelFile; //删除媒体文件
     string keyAddFile; //新增媒体文件记录
     string keyDelFile; //删除媒体文件记录
     string mediaServiceCmdChannel;//媒体服务器的命令发布通道
     string cmdDatetimeUpdate;//更新时间日期
     string cmdStorage;       //更新存储时间
     string keyDatetimeUpdate;//更新时间日期记录
     string keyStorage;       //更新存储时间记录
     string controllerCmdChannel;//综合管控的命令发布通道
};

class RedisManager
{
public:
    RedisManager();
    ~RedisManager();

    //redis单例
    static RedisManager *getInstance();

    //初始化redis
    void initRedis(const STU_REDIS_CONFIG &config, const STU_REDIS_CHANNEL &channel);

    //任务处理
    void startTask();
    void stopTask();
    void autoReconnect();

    //实际线程执行函数
    void loopRun();
    void subLoopRun();

    //文件新增
    void addFile(const string &jsonInfo);
    //文件删除
    void delFile(const string &filePath);

    //更新系统时间 需考虑权限问题
    void updateSystemDatetime(const string &dateTime);

private:
    //redis实例
    sw::redis::Redis *m_redis = nullptr;
    //redis连接状态
    bool m_connected = false;
    //运行标志
    volatile bool m_bRun;
    //条件变量
    std::condition_variable m_cv;
    std::mutex m_mutex;
    //任务线程
    std::thread *m_thread = nullptr;
    //订阅线程
    std::thread *m_subThread = nullptr;

    //交互信息
    std::vector<std::string> m_vecAddFiles;
    std::vector<std::string> m_vecDeleteFiles;

    //redis配置
    STU_REDIS_CONFIG m_config;
    STU_REDIS_CHANNEL m_channel;
};

#endif // REDISMANAGER_H
